/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.gob.mh.dgii.model.validators;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.springframework.beans.factory.annotation.Configurable;
import sv.gob.mh.dgii.common.Utils;
import sv.gob.mh.dgii.model.RcActEco;
import sv.gob.mh.dgii.model.TbActEco;
import sv.gob.mh.dgii.model.custom.constraints.SeccionEValid;
import sv.gob.mh.dgii.model.pojos.ruc.E;

/**
 *
 * @author hgonzalez
 */
public class SeccionEValidator implements ConstraintValidator<SeccionEValid, E> {

    private static String PRIMARIA_REQUERIDA = "Actividad primaria es obligatoria";
    private static String PRIMARIA_ACTUAL_NO_FINALIZADA = "La actividad primaria actual aun se encuentra activa";
    //private static String SECUNDARIA_REQUERIDA = "Actividad secundaria es obligatoria";
    //private static String TERCIARIA_REQUERIDA = "Actividad terciaria es obligatoria";
    private static String ACTIVIDADES_REPETIDAS = "Las actividades economicas no pueden ser repetidas";
    
    public void initialize(SeccionEValid a) {        
    }
    
    public boolean isValid(E e, ConstraintValidatorContext cvc) {       
        
        cvc.disableDefaultConstraintViolation();
        
        //Si la actividad actual no ha sido finalizada, no se puede agregar nueva
        
        RcActEco rc_primaria = getRcActEco(e, 1);        
        if(!Utils.isNullOrEmpty(rc_primaria) &&
            Utils.isNullOrEmpty(rc_primaria.getFfactEco()) &&
            !Utils.isNullOrEmpty(e.getPrimaria())){
                cvc.buildConstraintViolationWithTemplate(PRIMARIA_ACTUAL_NO_FINALIZADA).addConstraintViolation();
                return false;
        }
        
        //Si la actividad actual no es valida, es obligatorio que la
        //nueva este presente
        TbActEco primaria = getTbActEco(e, 1);
        TbActEco secundaria = getTbActEco(e, 2);
        TbActEco terciaria = getTbActEco(e, 3);
        
        if(!Utils.isNullOrEmpty(primaria) 
            && !primaria.getBstatus()
            && Utils.isNullOrEmpty(e.getPrimaria())){
                cvc.buildConstraintViolationWithTemplate(PRIMARIA_REQUERIDA).addConstraintViolation();
                return false;
        }
//        RcActEco primaria_rcacteco = getRcActEco(e, 1);
//        
//        if(!Utils.isNullOrEmpty(primaria) 
//            && Utils.isNullOrEmpty(e.getPrimaria()) 
//            && !Utils.isNullOrEmpty(primaria_rcacteco.getFfactEco())){
//                cvc.buildConstraintViolationWithTemplate(PRIMARIA_REQUERIDA).addConstraintViolation();
//                return false;
//        }
//        if(!Utils.isNullOrEmpty(secundaria) 
//            && !secundaria.getBstatus()
//            && Utils.isNullOrEmpty(e.getSecundaria())){
//                cvc.buildConstraintViolationWithTemplate(SECUNDARIA_REQUERIDA).addConstraintViolation();
//                return false;
//        }
//        if(!Utils.isNullOrEmpty(terciaria) 
//            && !terciaria.getBstatus()
//            && Utils.isNullOrEmpty(e.getTerciaria())){
//                cvc.buildConstraintViolationWithTemplate(TERCIARIA_REQUERIDA).addConstraintViolation();
//                return false;
//        }
        
        //Ahora verifico que las actividades no sean iguales entre si
        if(!Utils.isNullOrEmpty(e.getPrimaria())
           && !Utils.isNullOrEmpty(e.getSecundaria())
           && e.getPrimaria().getCactEco().equals(e.getSecundaria().getCactEco())){
                cvc.buildConstraintViolationWithTemplate(ACTIVIDADES_REPETIDAS).addConstraintViolation();
                return false;
        }
        if(!Utils.isNullOrEmpty(e.getPrimaria())
           && !Utils.isNullOrEmpty(e.getTerciaria())
           && e.getPrimaria().getCactEco().equals(e.getTerciaria().getCactEco())){
                cvc.buildConstraintViolationWithTemplate(ACTIVIDADES_REPETIDAS).addConstraintViolation();
                return false;
        }
        if(!Utils.isNullOrEmpty(e.getSecundaria())
           && !Utils.isNullOrEmpty(e.getTerciaria())
           && e.getSecundaria().getCactEco().equals(e.getTerciaria().getCactEco())){
                cvc.buildConstraintViolationWithTemplate(ACTIVIDADES_REPETIDAS).addConstraintViolation();
                return false;
        }
        
        return true;
    }
  
    private TbActEco getTbActEco(E e,int orden){
        for (RcActEco actEco : e.getActividadesActuales()) {
            if(actEco.getOrden().compareTo(new Long(orden))==0){
                return actEco.getTbActEco();
            }
        }
        return null;
    }
    
    private RcActEco getRcActEco(E e,int orden){
        for (RcActEco actEco : e.getActividadesActuales()) {
            if(actEco.getOrden().compareTo(new Long(orden))==0){
                return actEco;
            }
        }
        return null;
    }
}
